package org.example.java.jvm.error;

/**
 * VM Args：-Xss128k
 * Java Method Stack StackOverflowError
 * <p/>
 * 栈的基本特点就是 FILO（First In Last Out），如果 in 的太多而 out 的太少，就好 overflow 了。
 * 而 Java Method Stack 的功能就是保存每一次函数调用时的“现场”，即为入栈，
 * 函数返回就对应着出栈，所以函数调用的深度越大，栈就变得越大，足够大的时候就会溢出。
 * 所以模拟 Java Method Stack 溢出，只要不断递归调用某一函数就可以。
 * <p/>
 * run result:
 * stack length: 12552
 * java.lang.StackOverflowError
 * at jvm.StackOverflowErrorTest.stackOverflow(StackOverflowErrorTest.java:24)
 */
public class JavaVMStackSOF {

  private static int stackLength = 0;

  public static void stackOverflow() {
    ++stackLength;
    stackOverflow();
  }

  public static void main(String[] args) throws Throwable {
    try {
      stackOverflow();
    } finally {
      System.out.println("stack length: " + stackLength);
    }
  }
}